package py.edu.ucom.poo.waterloo.agente;

import py.edu.ucom.poo.waterloo.Ficha;
import py.edu.ucom.poo.waterloo.SandBox;
import py.edu.ucom.poo.waterloo.Tablero;
import py.edu.ucom.poo.waterloo.WaterlooApplicationException;
import py.edu.ucom.poo.waterloo.WaterlooLogicException;

public class Agente3 extends AgenteTest  {
	//Agente burro
	void moverColumna(Estado estadoAnterior, int i, int j, int incremento, int nivelProfundidadActual, int nivelProfunidadMaximo)
    {
        if (i + incremento < 10 && i + incremento >= 0)
        {
            nivelProfundidadActual++;
            Estado estadoNuevo = new Estado();
            estadoNuevo.getM().setOrigen(estadoAnterior.getT().getCasillaDelTablero(i, j));
            estadoNuevo.getM().setDestino(estadoAnterior.getT().getCasillaDelTablero(i + incremento, j));
            Ficha f=estadoNuevo.getM().getOrigen().getFicha();
            if (f!=null){
         	   estadoNuevo.setPeso(-2*(f.getVisitaAgente(estadoNuevo.getM().getOrigen().getPosX(),estadoNuevo.getM().getOrigen().getPosY())));
            }
            try
            {
                Tablero nuevoTablero = sandBoxInterface.getTablero(estadoAnterior.getT(), estadoNuevo.getM());
                if (incremento==POSITIVO && this.getColor()==SandBox.COLOR_BLUE){
                	estadoNuevo.setPeso(5);

    			}
                if (incremento==NEGATIVO && this.getColor()==SandBox.COLOR_RED){
                	estadoNuevo.setPeso(5);

                }
                //this.imprimirTablero(estadoAnterior.getT());
                estadoNuevo.setT(nuevoTablero);
                this.generarDatos(estadoNuevo);
                estadoAnterior.agregarHijo(estadoNuevo);
                estadoNuevo.setAnterior(estadoAnterior);
                if (nivelProfundidadActual < nivelProfunidadMaximo)
                {
                    generarTableros(estadoNuevo, nivelProfundidadActual, nivelProfunidadMaximo);
                }
                else
                {
                    asignarPeso(estadoNuevo,this);
                }
            } catch (WaterlooLogicException e)
            {
            //no se hace nada porque significa que el tablero no es valido y se descarta la rama
            }
        }
    }

    void moverFila(Estado estadoAnterior, int i, int j, int incremento, int nivelProfundidadActual, int nivelProfunidadMaximo)
    {
        if (j + incremento < 10 && j + incremento >= 0)
        {
            nivelProfundidadActual++;
            Estado estadoNuevo = new Estado();
            estadoNuevo.getM().setOrigen(estadoAnterior.getT().getCasillaDelTablero(i, j));
            estadoNuevo.getM().setDestino(estadoAnterior.getT().getCasillaDelTablero(i, j + incremento));
            Ficha f=estadoNuevo.getM().getOrigen().getFicha();
            if (f!=null){
         	   estadoNuevo.setPeso(-5*(f.getVisitaAgente(estadoNuevo.getM().getOrigen().getPosX(),estadoNuevo.getM().getOrigen().getPosY())));
            }
            try
            {
                Tablero nuevoTablero = sandBoxInterface.getTablero(estadoAnterior.getT(), estadoNuevo.getM());
                estadoNuevo.setT(nuevoTablero);
                this.generarDatos(estadoNuevo);
                estadoAnterior.agregarHijo(estadoNuevo);
                estadoNuevo.setAnterior(estadoAnterior);
                if (nivelProfundidadActual < nivelProfunidadMaximo)
                {
                    generarTableros(estadoNuevo, nivelProfundidadActual, nivelProfunidadMaximo);
                }
                else
                {
                    asignarPeso(estadoNuevo,this);
                }
            } catch (WaterlooLogicException e)
            {
            //no se hace nada porque significa que el tablero no es valido y se descarta la rama
            }
        }
    }

    public void asignarPeso(Estado e,Agente a)
    {
        int piezasPadre = e.getPiezasAntes();
        int piezasHijo = e.getPiezas();
        if (piezasHijo < piezasPadre){
            e.setPeso(1);
        }
        if (piezasHijo == piezasPadre){
            e.setPeso(1);
        }
        if (piezasHijo > piezasPadre){
            e.setPeso(1);
        }
        if (this.sandBoxInterface.hayFicha(e.getM().getDestino().getPosX(),e.getM().getDestino().getPosX())== true)
        	e.setPeso(2);
        
        Ficha f=e.getM().getOrigen().getFicha();
        if (f!=null){
     	   e.setPeso(-2*(f.getVisitaAgente(e.getM().getOrigen().getPosX(),e.getM().getOrigen().getPosY())));
        }
        try {
			if(a.sandBoxInterface.getValor(e.getM().getOrigen().getFicha(), a)>0){
				e.setPeso(2);
			}
		} catch (WaterlooLogicException e1) {
			//e1.printStackTrace();
		} catch (WaterlooApplicationException e1) {
			//e1.printStackTrace();
		}
    }

}